home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / or / or_rfc2or.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  4.9 KB  |  241 lines

  1. /* or_rfc2or.c: convert from rfc address to or address */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/or/RCS/or_rfc2or.c,v 6.0 1991/12/18 20:23:08 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/or/RCS/or_rfc2or.c,v 6.0 1991/12/18 20:23:08 jpo Rel $
  9.  *
  10.  * $Log: or_rfc2or.c,v $
  11.  * Revision 6.0  1991/12/18  20:23:08  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "or.h"
  19. #include "util.h"
  20. #include "ap.h"
  21.  
  22. extern char     *loc_dom_site;
  23. extern char     *loc_or;
  24. extern char     or_error[];
  25. static int    RFC_encode();
  26. static void    get_loc_val ();
  27. static int    my_or_str_isps();
  28.  
  29. int or_rfc2or_aux (rfc, or, adno)
  30. char            *rfc;
  31. OR_ptr          *or;
  32. int             adno;
  33. {
  34.     AP_ptr      ap,
  35.             group,
  36.             name,
  37.         local,
  38.         route,
  39.         domain;
  40.     char        buf[LINESIZE];
  41.     int        retval;
  42.     OR_ptr    tmp;
  43.     PP_DBG (("Lib/or_rfc2or ('%s')", rfc));
  44.  
  45.     /*
  46.     An address can be specified as: 'xxxx: ;'
  47.     */
  48.  
  49.     if (rfc_space (rfc))
  50.     return (or_blank (or));
  51.  
  52.  
  53.     local  = NULLAP;
  54.     domain = NULLAP;
  55.     route  = NULLAP;
  56.     *or = NULLOR;
  57.  
  58.     if ((ap = ap_s2t (rfc)) != BADAP
  59.      && ap_t2p (ap, &group, &name, &local, &domain, &route)
  60.         != BADAP)
  61.     {
  62.     if (route != NULLAP) {
  63.         ap_val2str(buf, route->ap_obvalue, route->ap_obtype);
  64.         if (or_str_isps (buf))
  65.             (void) or_domain2or (buf, or);
  66.         goto i_was_forced_into_this;
  67.     }
  68.  
  69.     if (domain != NULLAP) {
  70.         ap_val2str(buf, domain->ap_obvalue, domain->ap_obtype);
  71.         if (!or_str_isps (buf))
  72.             goto i_was_forced_into_this;
  73.     } else
  74.         (void) strcpy (buf, loc_dom_site);
  75.     
  76.     if (or_domain2or(buf, or) == NOTOK)
  77.            goto i_was_forced_into_this;
  78.  
  79.     if (local != NULLAP) {
  80.         get_loc_val (local, buf);
  81.         if(!my_or_str_isps (buf))
  82.             goto i_was_forced_into_this;
  83.     } else
  84.         buf[0] = '\0';
  85.  
  86.     tmp = or_tdup(*or);
  87.     if (or_local2or(buf, or) == OK) {
  88.         or_chk_admd(or);
  89.         /* check to see if what we've created */
  90.         /* actually matches with the standard */
  91.         if (or_valid_or(*or) == OK) {
  92.             or_free(tmp);
  93.             return (OK);
  94.         }
  95.         /* not valid so put rhs generated tree back */
  96.         or_free(*or);
  97.         *or = tmp;
  98.     } else {
  99.         or_free(*or);
  100.         *or = tmp;
  101.     }
  102.     } else {
  103.         if (ap != BADAP)
  104.             ap_free(ap);
  105.         return or_lose ("Can't parse address '%s'",rfc);
  106.     }
  107.  
  108. i_was_forced_into_this:;
  109.     retval = RFC_encode(rfc, or, adno, domain, route);
  110.     or_chk_admd(or);
  111.     if (ap != BADAP)
  112.         ap_free(ap);
  113.     return retval;
  114.  
  115. }
  116.  
  117. /* check 1148 constraints on str */
  118. static int my_or_str_isps(str)
  119. char *str;
  120. {
  121.     int    cont = TRUE, seenspace = FALSE;
  122.     if (isspace(*str) || isspace(str[strlen(str)-1]))
  123.         /* leading or trailing spaces */
  124.         return 0;
  125.  
  126.     while (*str && cont == TRUE) {
  127.  
  128.         if (isspace(*str)) {
  129.             if (seenspace == TRUE) {
  130.                 /* adjacent spaces */
  131.                 cont = FALSE;
  132.                 continue;
  133.             }
  134.             seenspace = TRUE;
  135.         } else
  136.             seenspace = FALSE;
  137.  
  138.         if ((*str == '$' 
  139.             && (*(str+1) == '=' || *(str+1) == '/') || *(str+1) == ';')
  140.             || *str == ';' || *str == '/'
  141.             || (or_isps(*str)))
  142.             str++;
  143.         else
  144.             cont = FALSE;
  145.     }
  146.     return *str == '\0';
  147. }
  148.  
  149. #define UB_DDA_VALUE    128
  150. #define UB_DDA_TYPE    8
  151.  
  152. static int RFC_encode(rfc, or, adno, domain, route)
  153. char    *rfc;
  154. OR_ptr    *or;
  155. int    adno;
  156. AP_ptr    domain,
  157.     route;
  158. {
  159.     char    buf[LINESIZE];
  160.     OR_ptr    ptr = NULLOR, new;
  161.     char    *dmn = NULLCP;
  162.     char    *start, *end, savech;
  163.     int len;
  164.     char    dda_type[UB_DDA_TYPE+1];
  165.     int        ddacount = 0;
  166.     /*
  167.     Make explicit RFC encoding
  168.     */
  169.     (void) or_asc2ps (rfc, buf);
  170.     len = strlen(buf);
  171.     start = &(buf[0]);
  172.     do {
  173.         if (len < UB_DDA_VALUE)
  174.             end = NULLCP;
  175.         else {
  176.             end = start + UB_DDA_VALUE;
  177.             savech = *end;
  178.             *end = '\0';
  179.         }
  180.         if (ddacount == 0)
  181.             (void) strcpy(dda_type, "RFC-822");
  182.         else
  183.             (void) sprintf(dda_type, "RFC822C%d", ddacount);
  184.         ddacount++;
  185.         new = or_new (OR_DD, dda_type, start);
  186.         if ((ptr = or_add (ptr, new, FALSE)) == NULLOR)
  187.             return NOTOK;
  188.         
  189.         len -= strlen(start);
  190.         start = end;
  191.         if (end != NULLCP)
  192.             *end = savech;
  193.     } while (start != NULLCP && *start != '\0');
  194.  
  195.  
  196.     if (*or == NULLOR) {
  197.         if (route != NULLAP)
  198.             dmn = route -> ap_obvalue;
  199.         else if (domain != NULLAP)
  200.             dmn = domain -> ap_obvalue;
  201.  
  202.         if (adno == 0
  203.         /* MTS originator */
  204.         || dmn == NULLCP
  205.         || tb_get1148gate (dmn, or) != OK)
  206.             /* RFC_encode with local or */
  207.             *or = or_std2or (loc_or);
  208.     }
  209.     for (new = ptr; new != NULLOR; new = ptr) {
  210.         ptr = new -> or_next;
  211.         new -> or_next = NULLOR;
  212.         *or = or_add( *or, new, TRUE);
  213.         if (*or == NULLOR)
  214.             return NOTOK;
  215.     }
  216.     return (OK);
  217. }
  218.  
  219. static void get_loc_val (lap, buf)
  220. AP_ptr lap;
  221. char buf[];
  222. {
  223.     for (buf[0] = '\0'; lap != NULLAP; lap = lap -> ap_next) {
  224.         switch (lap -> ap_obtype) {
  225.             default:
  226.             case AP_NIL:
  227.             break;
  228.             case AP_COMMENT:
  229.             continue;
  230.  
  231.             case AP_GENERIC_WORD:
  232.             case AP_MAILBOX:
  233.             if (buf[0])
  234.                 (void) strcat (buf, " ");
  235.             (void) strcat (buf, lap -> ap_obvalue);
  236.             continue;
  237.         }
  238.         break;
  239.     }
  240. }
  241.